package com.gougou.manager.web.controller;

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.gougou.common.entity.EasyUIResult;
import com.gougou.common.entity.JsonBean;
import com.gougou.common.util.ControllerUtil;
import com.gougou.common.util.StatusUtil;
import com.gougou.manager.pojo.*;
import com.gougou.manager.service.MPTbItemDescService;
import com.gougou.manager.service.MPTbItemParamItemService;
import com.gougou.manager.service.MPTbItemService;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;

import java.util.*;

/**
 * <p>
 * 商品表 前端控制器
 * </p>
 *
 * @author ${author}
 * @since 2018-09-07
 */
@RestController
@RequestMapping("/tbItem")
@Transactional
public class TbItemController {
    @Autowired
    private MPTbItemService itemService;
    @Autowired
    private MPTbItemDescService itemDescService;
    @Autowired
    private TbItemCatController ICC;
    @Autowired
    private MPTbItemParamItemService itemParamItemService;

    // MQ所需
    @Autowired
    private RabbitTemplate rabbitTemplate;
    private static final ObjectMapper MAPPER = new ObjectMapper();


    /*******************************
     *
     * 分页查询商品
     * 传入
     * 当前页，最大页数
     *
     * @param page
     * @param rows
     * @return
     * *****************************
     */
    @RequestMapping("/itemPage")
    public EasyUIResult getPageItem(@RequestParam(defaultValue ="1" )int page, @RequestParam(defaultValue ="20" )int rows){
        try {
            EasyUIResult easyUIResult = new EasyUIResult();

            EntityWrapper<TbItem> itemWrapper = new EntityWrapper<TbItem>();
            itemWrapper.where("status != {0}",3);//排除被删除
            itemWrapper.orderBy("created desc");//按照创建时间倒序
            //创建一个集合
            ArrayList list = new ArrayList();
            //查询数据
            List<TbItem> itemlist = itemService.selectPage(new Page(page, rows),itemWrapper).getRecords();
            for(int i=0;i<itemlist.size();i++){
                ItemInfo itemInfo = new ItemInfo();
                itemInfo.setCidName(ICC.QueryTbItemCatGetName(Integer.parseInt(String.valueOf(itemlist.get(i).getCid()))));
                itemInfo.setCreated(itemlist.get(i).getCreated());
                itemInfo.setId(itemlist.get(i).getId());
                itemInfo.setStatus(itemlist.get(i).getStatus());
                itemInfo.setUpdated(itemlist.get(i).getUpdated());
                itemInfo.setBarcode(itemlist.get(i).getBarcode());
                itemInfo.setImage(itemlist.get(i).getImage());
                itemInfo.setNum(itemlist.get(i).getNum());
                itemInfo.setPrice(itemlist.get(i).getPrice());
                itemInfo.setSellPoint(itemlist.get(i).getSellPoint());
                itemInfo.setTitle(itemlist.get(i).getTitle());
                itemInfo.setCid(itemlist.get(i).getCid());
                list.add(itemInfo);
            }
            easyUIResult.setRows(list);

            //查询总条数
            easyUIResult.setTotal((long) itemService.selectCount(itemWrapper));

            return easyUIResult;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /***************************
     *
     * 查询商品信息通过id
     *
     * @param id
     * @return
     * **************************
     */
    @RequestMapping("/selectItem/{id}")
    public TbItem getItemById(@PathVariable long id){
        try {
            return itemService.selectById(id);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;

    }

    /****************************
     *
     * 添加商品
     *
     * @param item
     * @return
     * **************************
     */
    @RequestMapping(value = "/addItem",method = RequestMethod.POST)
    public ResponseEntity<Void> addItem(TbItem item , String desc , String itemParams){
        try {
            Date date = new Date();
            //插入商品主表
            item.setStatus(1);
            item.setId(null);
            item.setCreated(date);
            item.setUpdated(date);
            boolean insert = itemService.insert(item);

            if (insert==false){
                //返回服务器异常 （500状态码）
                return StatusUtil.SERVER_ERROR();
            }

            //插入商品描述
            TbItemDesc itemDesc = new TbItemDesc();
            itemDesc.setItemId(item.getId());
            itemDesc.setItemDesc(desc);
            itemDesc.setCreated(date);
            itemDesc.setUpdated(date);
            itemDescService.insert(itemDesc);

            //插入商品规格参数
            if(itemParams!=null || !"".equals(itemParams)){
                TbItemParamItem tbItemParamItem = new TbItemParamItem();
                tbItemParamItem.setItemId(item.getId());
                tbItemParamItem.setParamData(itemParams);
                tbItemParamItem.setCreated(date);
                tbItemParamItem.setUpdated(date);
                itemParamItemService.insert(tbItemParamItem);
            }

            //发送消息到MQ的交换机，通知其他系统
            sendMsg(item.getId(), "insert");

            //返回创建成功 （201状态码）
            return StatusUtil.CREATED();
        } catch (Exception e) {
            e.printStackTrace();
        }

        //返回服务器异常 （500状态码）
        return StatusUtil.SERVER_ERROR();
    }



    /****************************
     *
     * 修改商品
     *
     * @param item
     * @return
     * **************************
     */
    @RequestMapping(value = "/updateItem",method = RequestMethod.PUT)
    public ResponseEntity<Void> updateItem(TbItem item , String desc ,String itemParams){

        try {
            Date date = new Date();
            //修改主表-----------------------------------------
            //封装修改时间
            item.setUpdated(date);

            //封装图片地址：加上之前的图片
            item.setImage(itemService.selectById(item.getId()).getImage()+","+item.getImage());
            boolean insert = itemService.updateById(item);

            if (insert==false){
                //返回服务器异常 （500状态码）
                return StatusUtil.SERVER_ERROR();
            }

            //修改详细表-----------------------------------------
            //封装商品详细
            TbItemDesc itemDesc = new TbItemDesc();
            itemDesc.setItemDesc(desc);
            itemDesc.setUpdated(date);

            EntityWrapper<TbItemDesc> itemDescwrapper = new EntityWrapper<TbItemDesc>();
            itemDescwrapper.where("item_id={0} ",item.getId());

            boolean update = itemDescService.update(itemDesc,itemDescwrapper);

            if (update==false){
                //返回服务器异常 （500状态码）
                return StatusUtil.SERVER_ERROR();
            }
            //修改规格表--------------------------------------------------------------------
            //判断是否有规格参数
            if(itemParams!=null || "".equals(itemParams)){
                //封装需要修改的规格参数
                TbItemParamItem tbItemParamItem = new TbItemParamItem();
                tbItemParamItem.setUpdated(date);
                tbItemParamItem.setParamData(itemParams);

                EntityWrapper entityWrapper = new EntityWrapper();
                entityWrapper.where("item_id={0}",item.getId());

                itemParamItemService.update(tbItemParamItem,entityWrapper);
            }

            //发送消息到MQ的交换机，通知其他系统
            sendMsg(item.getId(), "update");

            //返回OK （200状态码）
            return StatusUtil.OK();
        } catch (Exception e) {
            e.printStackTrace();
        }

        //返回服务器异常 （500状态码）
        return StatusUtil.SERVER_ERROR();
    }



    /**************************
     *
     * 删除商品 (真删)
     * 先删除商品详细，再删除主表
     *
     * @param ids
     * @return
     * ************************
     */
//    @RequestMapping("/deleteItem")
//    public ResponseEntity<Void> deleteItem(String ids){
//
//        String[] idSplit = ids.split(",");
//
//        for (String id:idSplit){
//            //先删除详细
//            EntityWrapper<TbItemDesc> descWrapper = new EntityWrapper<>();
//            descWrapper.where("item_id={0}",id);
//            boolean check = itemDescService.delete(descWrapper);
//
//            if (check==false){
//                return StatusUtil.SERVER_ERROR();
//            }
//            //删除主表
//            EntityWrapper<TbItem> ItemWrapper = new EntityWrapper<>();
//            ItemWrapper.where("id={0}",id);
//            check=itemService.delete(ItemWrapper);
//
//            if (check==false){
//                return StatusUtil.SERVER_ERROR();
//            }
//        }
//
//        return StatusUtil.OK();
//    }

    /**************************
     *
     * 删除商品 (改商品状态为3)
     * 先删除商品详细，再删除主表
     *
     * @param ids
     * @return
     * ************************
     */
    @RequestMapping("/deleteItem")
    public JsonBean deleteItem(String ids){

        // 发送消息到MQ的交换机，通知其他系统
        String[] idList = ids.split(",");
        for(int i=0;i<idList.length;i++){
            Long id = Long.valueOf(idList[i]);
            sendMsg(id, "delete");
        }

        return updataStatus(ids,3)?ControllerUtil.setSuccessCode():ControllerUtil.setFailCode("系统错误");
    }


    /**************************
     *
     * 上架商品(改商品状态为1)
     *
     * @param ids
     * @return
     * ************************
     */
    @RequestMapping("/reshelf")
    public JsonBean reshelf(String ids){
        return updataStatus(ids,1)?ControllerUtil.setSuccessCode():ControllerUtil.setFailCode("系统错误");
    }


    /**************************
     *
     * 下架商品(改商品状态为2)
     *
     * @param ids
     * @return
     * ************************
     */
    @RequestMapping("/instock")
    public JsonBean instockItem(String ids){
        return updataStatus(ids,2)?ControllerUtil.setSuccessCode():ControllerUtil.setFailCode("系统错误");
    }



    //-----------------------------------------------------------------------------------------------

    /*************************
     *
     * 改变商品状态
     * 1-正常，2-下架，3-删除
     *
     * @return
     * ***********************
     */

    public boolean updataStatus(String ids, int status){

        // 直接替换
        String IdsSTR = ids.replaceAll(",", " or id=");

        EntityWrapper<TbItem> wrapper = new EntityWrapper<TbItem>();
        wrapper.where("id="+IdsSTR);

        TbItem item = new TbItem();
        item.setStatus(status);

        itemService.update(item,wrapper);
        return true;
    }


    /**
     * 发送消息到MQ的交换机，通知其他系统
     * @param itemId
     * @param type
     */
    private void sendMsg(Long itemId, String type){
        try {
            Map<String, Object> msg = new HashMap<String, Object>();
            msg.put("itemId", itemId);
            msg.put("type", type);
            msg.put("date", System.currentTimeMillis());
            this.rabbitTemplate.convertAndSend("item." + type, MAPPER.writeValueAsString(msg));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

